"""
Author: HuWen
@file: RoleDetector.py
@dateTime: 2025/8/13 10:32
加油加油！！！
"""
import json
from typing import List, Dict
import pytest
from playwright.sync_api import sync_playwright

from conf.base_conf import BaseConf


class RoleDetector:
    def __init__(self, page):
        self.page = page  # 接收已登录的页面实例
        self.results: List[Dict] = []

    def detect_roles(self):
        """探测页面中所有元素的role信息"""
        # 等待页面加载完成
        self.page.wait_for_load_state("networkidle")

        # 使用JS获取所有带role属性的元素（适配框架中的role定位方式）
        elements = self.page.evaluate("""
            () => {
                const results = [];
                // 获取所有有role属性的元素
                document.querySelectorAll('[role]').forEach(el => {
                    // 尝试获取可能的页面容器信息（适配page_role和page_title）
                    let pageRole = null;
                    let pageTitle = null;
                    const closestDialog = el.closest('[role="dialog"]');
                    if (closestDialog) {
                        pageRole = 'dialog';
                        pageTitle = closestDialog.querySelector('[role="heading"]')?.textContent?.trim() || '';
                    }

                    results.push({
                        tag: el.tagName,
                        role: el.getAttribute('role'),
                        text: el.textContent?.trim() || '',
                        id: el.id || '',
                        class: el.className || '',
                        name: el.getAttribute('name') || '',
                        page_role: pageRole,
                        page_title: pageTitle
                    });
                });
                return results;
            }
        """)

        self.results = elements

    def filter_by_role_type(self, role_type: str) -> List[Dict]:
        """根据role类型筛选元素（适配框架中的By类角色）"""
        return [el for el in self.results if el['role'] == role_type]

    def save_results(self, file_path: str):
        """保存探测结果到JSON文件"""
        with open(file_path, 'w', encoding='utf-8') as f:
            json.dump(self.results, f, ensure_ascii=False, indent=2)


@pytest.fixture(scope='session')
def login():
    # 复用已有的登录fixture
    with sync_playwright() as playwright:
        browser_type = getattr(playwright, BaseConf.BROWSER)
        browser = browser_type.launch(headless=BaseConf.HEADLESS)
        context = browser.new_context()
        page = context.new_page()
        page.set_default_timeout(BaseConf.TIMEOUT)
        page.set_viewport_size({"width": 1920, "height": 1080})
        page.goto(BaseConf.BASE_URL)
        page.get_by_placeholder('账号').fill(BaseConf.ACCOUNT)
        page.get_by_placeholder('密码').fill(BaseConf.PASSWORD)
        page.get_by_placeholder('验证码').fill('1111')
        page.get_by_role('button', name='登录').click()
        yield page
        context.close()
        browser.close()


def test_detect_roles(login):
    """使用登录后的页面进行role探测的测试用例"""
    page = login
    # 可以在这里添加导航到目标页面的操作（根据实际菜单路径修改）
    # 例如：导航到风险分析对象页面
    page.get_by_role('menuitem', name='安全基础管理').click()
    page.get_by_role('menuitem', name='企业档案').click()
    page.get_by_role('tab', name='企业图件信息').click()

    # detector = RoleDetector(page)
    # print("\n请在浏览器中操作到需要探测的页面（如打开新增弹窗），完成后按回车键继续...")
    # input()  # 等待用户手动操作
    #
    # detector.detect_roles()


    detector = RoleDetector(page)
    print("\n请在浏览器中操作到需要探测的页面（如打开新增弹窗），完成后按回车键继续...")
    # 模拟用户输入回车键
    monkeypatch.setattr('builtins.input', lambda _: '')
    input()  # 现在这个input会返回空字符串，模拟用户按下回车

    detector.detect_roles()

    print("\n探测到的所有元素role信息：")
    for item in detector.results:
        print(
            f"page_role: {item['page_role']}, "
            f"page_title: {item['page_title']}, "
            f"role: {item['role']}, "
            f"name: {item['name']}, "
            f"text: {item['text']}"
        )

    # 保存结果到locators层对应的目录（遵循命名规范）
    detector.save_results("locators/basicSecurityInformation/page_roles.json")
    print("\n结果已保存到locators目录下的JSON文件")